Dart _fe_analyzer_shared scanner AbstractScanner bigSwitch
bigSwitch
是 AbstractScanner 类中的一个方法,它的主要任务是处理源代码中的各种字符,并将它们转换为相应的词素。
int bigSwitch(int next) {
// 首先,它调用 `beginToken` 方法来开始一个新的词素。
beginToken();
// 然后,它检查下一个字符是否是空格、制表符、换行符或回车符。
// 如果是,它会调用 `appendWhiteSpace` 方法来处理这些空白字符,
// 并快速跳过连续的空格字符。
if (identical(next, $SPACE) ||
identical(next, $TAB) ||
identical(next, $LF) ||
identical(next, $CR)) {
appendWhiteSpace(next);
next = advance();
// 并快速跳过连续的空格字符。
while (identical(next, $SPACE)) {
next = advance();
}
return next;
}
int nextLower = next | 0x20;
// `$a`和`$z`是两个常量,分别表示小写字母'a'和'z'的 ASCII 值。
// `nextLower` 是下一个字符的小写形式的 ASCII 值。
// 这个 `if` 语句检查下一个字符是否是小写字母。
if ($a <= nextLower && nextLower <= $z) {
// 如果下一个字母是'r'进if,'r'有什么特殊含义?
// 在 Dart 中,原始字符串是以 'r' 开头的字符串,例如 `r"This is a raw string"`。
if (identical($r, next)) {
return tokenizeRawStringKeywordOrIdentifier(next);
}
return tokenizeKeywordOrIdentifier(next, /* allowDollar = */ true);
}
// 关括号
if (identical(next, $CLOSE_PAREN)) {
return appendEndGroup(TokenType.CLOSE_PAREN, OPEN_PAREN_TOKEN);
}
// 开括号
if (identical(next, $OPEN_PAREN)) {
appendBeginGroup(TokenType.OPEN_PAREN);
return advance();
}
// 分号
if (identical(next, $SEMICOLON)) {
appendPrecedenceToken(TokenType.SEMICOLON);
// Type parameters and arguments cannot contain semicolon.
discardOpenLt();
return advance();
}
// 点
if (identical(next, $PERIOD)) {
return tokenizeDotsOrNumber(next);
}
// 逗号
if (identical(next, $COMMA)) {
appendPrecedenceToken(TokenType.COMMA);
return advance();
}
// 等于号
if (identical(next, $EQ)) {
return tokenizeEquals(next);
}
// 花括号关
if (identical(next, $CLOSE_CURLY_BRACKET)) {
return appendEndGroup(
TokenType.CLOSE_CURLY_BRACKET,
OPEN_CURLY_BRACKET_TOKEN);
}
// 斜杠
if (identical(next, $SLASH)) {
return tokenizeSlashOrComment(next);
}
// 花括号开
if (identical(next, $OPEN_CURLY_BRACKET)) {
appendBeginGroup(TokenType.OPEN_CURLY_BRACKET);
return advance();
}
// 双引号、单引号
if (identical(next, $DQ) || identical(next, $SQ)) {
return tokenizeString(next, scanOffset, /* raw = */ false);
}
// 下划线
if (identical(next, $_)) {
return tokenizeKeywordOrIdentifier(next,
/* allowDollar = */ true);
}
// 双引号
if (identical(next, $COLON)) {
appendPrecedenceToken(TokenType.COLON);
return advance();
}
// 小于号
if (identical(next, $LT)) {
return tokenizeLessThan(next);
}
// 大于号
if (identical(next, $GT)) {
return tokenizeGreaterThan(next);
}
// 叹号
if (identical(next, $BANG)) {
return tokenizeExclamation(next);
}
// 方括号开
if (identical(next, $OPEN_SQUARE_BRACKET)) {
return tokenizeOpenSquareBracket(next);
}
// 方括号关
if (identical(next, $CLOSE_SQUARE_BRACKET)) {
return appendEndGroup(
TokenType.CLOSE_SQUARE_BRACKET,
OPEN_SQUARE_BRACKET_TOKEN);
}
// @
if (identical(next, $AT)) {
return tokenizeAt(next);
}
// 数字
if (next >= $1 && next <= $9) {
return tokenizeNumber(next);
}
// &
if (identical(next, $AMPERSAND)) {
return tokenizeAmpersand(next);
}
// 0
if (identical(next, $0)) {
return tokenizeHexOrNumber(next);
}
// 问号
if (identical(next, $QUESTION)) {
return tokenizeQuestion(next);
}
// |
if (identical(next, $BAR)) {
return tokenizeBar(next);
}
// +
if (identical(next, $PLUS)) {
return tokenizePlus(next);
}
// $
if (identical(next, $)) {
return tokenizeKeywordOrIdentifier(next,
/* allowDollar = */ true);
}
// -
if (identical(next, $MINUS)) {
return tokenizeMinus(next);
}
// *
if (identical(next, $STAR)) {
return tokenizeMultiply(next);
}
// ^
if (identical(next, $CARET)) {
return tokenizeCaret(next);
}
// 波浪符(~)
if (identical(next, $TILDE)) {
return tokenizeTilde(next);
}
// %
if (identical(next, $PERCENT)) {
return tokenizePercent(next);
}
// 反引号(`)
if (identical(next, $BACKPING)) {
appendPrecedenceToken(TokenType.BACKPING);
return advance();
}
// 反斜杠(\)
if (identical(next, $BACKSLASH)) {
appendPrecedenceToken(TokenType.BACKSLASH);
return advance();
}
// 井号(#)
if (identical(next, $HASH)) {
return tokenizeTag(next);
}
if (next < 0x1f) {
return unexpected(next);
}
// unicode 处理
next = currentAsUnicode(next);
return unexpected(next);
}
本文作者:Maeiee
本文链接:Dart _fe_analyzer_shared scanner AbstractScanner bigSwitch
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!